iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
自我挑戰組

用Unity製作連線遊戲系列 第 21

Deploy Cloud Function via Serverless

  • 分享至 

  • xImage
  •  

Deploy Cloud Function via Serverless

今天才正式有時間來試著將cloud function推上到google cloud function。而本來認為用serverless可以省去不少時間,但不盡如此,故特地將過程記錄下來。

一開始最直覺的想法是到serverless官網上看有沒有範例,但在官網上利用filter的方式找GCP配合golang,會找不到任何範例。本想說那就找AWS配合golang,最找GCP配合nodejs,再折衷的把二個範例裡的部份內容抽出來,進行組合和運用。所幸在example裡找到了二年沒有更新的範例。就想直接將這個範例放到專案裡進行佈吏署的試驗,若是可以也就不用自行在那組合、折解、合併。不過沒想到這中間有一些文件沒有特別更新到的說明部份,讓整個deploy花了不少時間。

先來看原始的碼中放的serverless.yml和搭配範例的另一份文件,文件算是很詳細,主要就二部份要處理,一個是開啓API,另一個則是創立service account後給權限。

service: golang-simple-http-endpoint

frameworkVersion: ">=1.33.0 <2.0.0"

package:
  exclude:
    - node_modules/**
    - .gitignore
    - .git/**

plugins:
  - serverless-google-cloudfunctions

# The GCF credentials can be a little tricky to set up. Luckily we've documented this for you here:
# https://serverless.com/framework/docs/providers/google/guide/credentials/
#
# NOTE: the golang runtime is currently in alpha state, you must have access from google to use the alpha toolchain
provider:
  name: google
  runtime: go111                           # currently both vendored and go.mod repos are supported
  project: sborza-91                    # replace with your project name here
  credentials: ~/.gcloud/slsframework.json # path must be absolute, change to whichever keyfile you need

functions:
  hello:
    handler: Hello
    events:
      - http: path

為了要佈署而產生的一份Dockerfile,這份是依照其README.md的步驟寫的

# FROM node:latest

COPY . /app

WORKDIR /app

RUN npm install -g serverless

RUN serverless deploy -v

但執行時首先會碰到的問題是serverless版本,現在已經是2.1.x版了,所以要更新那。project不用說,肯定是要更新成目前GCP的project id。而runtime,從這份文件可以知道目前已到了1.13版,所以可以換成go113。那份slsframework.json就是service account產生出的json檔。

不過若是直接執行還是會有錯。參考了這二個討論,知道了是少了npmc install安裝相依性。

但修正完後還是會看到"cloudfunctions.v1beta2.function相關的錯誤訊息。找了一大堆的討論和文章,終於找到了,原來是serverless-google-cloudfunctions版本太舊

更新package.json到拿取最新的版本即可

"dependencies": {
  "serverless-google-cloudfunctions": "*"
}

調整之後可以用

serverless deploy

將範例的cloud function推上去。但使用

serverless logs --function hello

還是會得到

Error: The caller does not have permission

的訊息。只好先撇開這個錯誤,先往下試再加入一個範例,否可以正常的推上去。而這個範例就是Auth Trigger的cloud function。不過在serverless官方的網站上只看到pub sub event的範例,沒有auth的,而在討論裡也只有看到cloud storage的trigger寫法,當下並不清楚如果是auth event要怎麼寫。

還好找gcp官方文件裡可以看到

Pub/Sub

文件裡的這一段話很讓人在意,

The gcloud command below deploys a function that is triggered by legacy Pub/Sub notifications on a specific topic. These notifications are supported for legacy functions already consuming these events. However, we recommend using the --trigger-topic flag instead, as the legacy notifications might be removed at a future date.

gcloud functions deploy FUNCTION_NAME \
--trigger-resource TOPIC_NAME \
--trigger-event providers/cloud.pubsub/eventTypes/topic.publish \
FLAGS...

回看到serverless的文件,好像就是之前版本的用法,至於新的用法是可行的嗎?

利用serverless放到firebase後,原先的http function是不會有問題的,但auth則呈現出錯誤的圖示

Error

"status": {
    "code": 3,
    "message": "Build failed: # serverless_function_app/main\nsrc/serverless_function_app/main/main.go:24:43: cannot refer to unexported name hello.helloAuth\nsrc/serverless_function_app/main/main.go:24:43: undefined: hello.helloAuth\nsrc/serverless_function_app/main/main.go:26:44: cannot refer to unexported name hello.helloAuth\nsrc/serverless_function_app/main/main.go:26:44: undefined: hello.helloAuth; Error ID: 6191efcd"
}

看樣子,只是一個大小寫的新手錯誤。順利的話,就可以開始進行撰寫實際行為的工作了。


上一篇
More on Firestore
下一篇
Start to Know Vault
系列文
用Unity製作連線遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言